# 导入flask类
# render_template 从 jinjia2的库自动带的
from flask import Flask, request, render_template
# pymysql 连接数据库的驱动, SQLAlchemy 类似jdbc可以简单的操作数据库
from flask_sqlalchemy import SQLAlchemy
# flask_migrate 如果需要对数据库的结构进行改变，需用上数据迁移工具
# 运行flask db init命令 只运行一次，可以自动创建当前版本的数据迁移脚本。
# 在项目目录中，增加了一个migrations的文件夹，其中的文件应加入git进行跟踪。
# versions：文件夹，用于存放后面生成的迁移文件脚本。
# alembic.ini：alembic配置文件。
# env.py：配合Flask项目进行迁移的配置文件。
# script.py.mako：生成迁移脚本的模板文件。

# flask db migrate
import flask_migrate

app = Flask(__name__)

HOSTNAME = "127.0.0.1"
PORT = 3306
USERNAME = "root"
PASSWORD = "root"
DATABASE = "PearAdminFlask"
app.config["SQLALCHEMY_DATABASE_URI"] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"

# SQLAlchemy 会自动的读取confg中的配置信息
db = SQLAlchemy(app)
# 获取到app 和连接好的数据库
migrate = flask_migrate.Migrate(app,db)
# 需要时空 数据库,不然会导致问题
# flask db init  会生成migrations文件夹.
# flask db migrate versions文件夹下产生了脚本文件,需要修改模型后,才会生成脚本文件
# flask db upgrade 运行脚本,修改表结构

class User(db.Model):
    __tablename__ = 'testuser'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100), nullable=False)
    # 用户关联文章模型,反向输入的数据来自哪个表格
    # article_list = db.relationship("Article",back_populates="test_article")
    # 新添加的字段,不会映射到table表里边
    email = db.Column(db.String(100), nullable=False)

class Article(db.Model):
    __tablename__ = 'test_article'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.String(200), nullable=False)
    # 这个是外键,关联的是用户的id,  testuser用户表的id字段
    author_id = db.Column(db.Integer, db.ForeignKey('testuser.id'))
    # 关联用户模型,反向输入的数据来自 用户表
    # author = db.relationship("User",back_populates="testuser")
    # 会自动的关联,用户模型,并且添加article_list 的属性来相互的关联
    author = db.relationship("User",backref="article_list")

with app.app_context():
    # 创建所有的表格,将模型映射到数据库,
    # 局限性,表格存在,不会更新模型的新属性和字段
    db.create_all()


# 创建路由,返回页面渲染函数
@app.route("/")
def index():
    return render_template("index.html")




if __name__ == '__main__':
    # debug=True, 开启bug模模式,修改代码数据重新加载,热部署
    # 修改端口,8888
    # 修改host,监听主机名,0.0.0.0 通过ip地址就可以让其他的电脑访问项目
    app.run(host='0.0.0.0', port=5000, debug=True)
